import torch
import numpy as np

y = np.array([1, 0, 0])
z = np.array([0.2, 0.1, -0.1])

y_pred = np.exp(z) / np.exp(z).sum()
loss = (-y * np.log(y_pred)).sum()
print(loss)

# CrossEntropyLoss 要求标签是 类别索引，而不是 one-hot 向量。
# 所以必须用 torch.LongTensor（整数类型），而不能是 float。
# y = [0] 表示真实类别是第 0 类。
y_torch = torch.LongTensor([0])
z_torch = torch.Tensor([[0.2, 0.1, -0.1]])
# CrossEntropyLoss 的输入是 logits（原始分数，不需要经过 softmax）。
# 内部会自动做：softmax → log → NLLLoss。
loss_torch = torch.nn.CrossEntropyLoss()
loss = loss_torch(z_torch, y_torch)
print(loss)
